package tsing.good_simple.abstractLock.singleProjectAbstract;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Date 2024/11/25 13:30
 * @Author Tsing
 *
 * 单体项目的加锁抽象 ，加锁方式不适用与分布式项目 ，demo中包含三种加锁的方式
 * 1.普通的加锁
 * 2.模板方法的加锁
 * 3.SpringAop +注解的方式加锁
 */
public class LockDemo {


    private final ReentrantLock lock = new ReentrantLock();

    // 注入 ，如果是Spring项目，可以使用@Autowired
    private final  LockTemplateSupport lockTemplateSupport = new LockTemplateSupport();


    /**
     * 使用普通方法加锁
     * @throws InterruptedException
     */
    public void syncMethod1() throws InterruptedException {
        boolean lockFlag = lock.tryLock(1, TimeUnit.MILLISECONDS);
        if(!lockFlag){
            return ;
        }
        try {
            // 加锁成功,执行业务方法
            coreMethod();

        } finally {
            // 解锁
            lock.unlock();
        }
    }

    /**
     * 使用抽象方法加锁
     * @throws InterruptedException
     */
    public void syncMethod2() throws InterruptedException {

        lockTemplateSupport.executeWithLock("myLock",1,TimeUnit.MINUTES, this::coreMethod);

    }


    /**
     * 模拟业务方法
     */
    @LockAnnotation(timeOut = 1,unit = TimeUnit.MINUTES,key = "myLock")
    public Integer coreMethod(){
        System.out.println("do something");
        return 1;
    }




}
